8.4 Advanced expression language features

8.4.1 Linking the value stack to the expression language

  • OGNL은 value stack을 지원하고 하나의 root객체가 있다고 가정하지만 WebWork의 value stack은 많은 가상의 roots를 요구한다.
  • top 키워드 - 리턴되는 스택의 top에 있는 객체를 가리킨다.

  • Table 8.12 Examples of accessing the value stack
OGNL expression설명
lifeSizedmuppet.isLifeSized() 호출한다.
salaryperson.getSalary() 호출한다.
name스택의 top이 muppet이기 때문에 muppet.getName()을 호출한다.
[WEBSTUDY:1].name[WEBSTUDY:1] 1자리에서 스택을 아래로 찾기 때문에 person.getName()을 호출한다.
topMuppet를 리턴한다
[WEBSTUDY:1].top첫번째의 새롭고, 더 작은 스택이 리턴되기 때문에 person이 리턴된다

  • [WEBSTUDY:1] 은 스택의 1 인덱스에 있는 객체를 가져오라는 것을 의미하지 않는다.
  • 스택에 존재하는 한 조각을 가져오라는 것을 의미한다.
  • findValue('name')은 top(Object 0)의 name을 가져온다
  • [WEBSTUDY:1] 은 객체 1과 2의 스택을 지시하고 object2만 name 속성을 가지기 때문에 object2의 name을 가져온다.

8.4.2 Data type conversion

  • Table 8.13 Two examples of data conversion
OGNL expression설명
#kermit.age = "25"int 에 String 값을 넣을 때 25로 컨버젼한다
#kermit.name= 25String에 int 값을 넣을 때 "25"로 컨버젼한다

8.4.3 Handling null property access

  • 웹 페이지에서 Kermit's name, father's name, grandfather's name을 요청할때 두가지 방법
    ■ action에서 세 개의 Muppets를 만들고 names 세팅하고 관계를 연결한다.(일반적인 방법)
    ■ action에서 kermit.name, kermit.father.name, kermit.father.father.name 을 세팅한다. 하나의 Muppet를 포함한다.(WebWork)
  • father의 Muppet 생성없이 father.name에 값을 세팅하려고 할때 NullPointerException이 일어난다.
  • 이 때, OGNL에서 null 객체가 발견되면 실체 객체로 바꾸고 son-father-grandfather의 객체 지도를 만든다.
  • 보다 자세한 내용은 12장

8.4.4 Creating lambda expressions on the fly

  • lambda expression 은 하나의 인수를 가지고 조그마한 함수같은 역할을 한다. 함수는 아니고 OGNL context 그 자체.
    형식
    :[WEBSTUDY: ... ]
    #isKermit = :[ #this.name == \@vs\@OG_MUPPET ? true : false ]
  • Table 8.14 Examples of lambda expression
OGNL expression설명
#isKermit(top)스택의 top에 있는 객체가 Kermit's name 가지고 있는지 결정한다
#isKermit(#kermit)true
#isKermit(#piggy)false
  • 과용해서는 안된다.